package com.example.java.zuo.新手班.class02;

/**
 * @Author : 佩萁
 * Description :
 * @Create : 2023/12/8 - 16:50
 */
public class EqualReturn01 {
    public static void main(String[] args) {
        int count = 0;
        int testTimes = 100000000;
        for (int i = 0; i < testTimes; i++) {
            if (f2() == 0) {
                count++;
            }
        }
        System.out.println((double) count / (double) testTimes);//0.50005492

        System.out.println("==============");
        int[] counts = new int[8];
        for (int i = 0; i < testTimes; i++) {
            int num = f3();
            counts[num]++;
        }
        for (int i = 0; i < 8; i++) {
            System.out.println(i + "这个数，出现了" + counts[i] + "次");
        }
        //0这个数，出现了12494340次
        //1这个数，出现了12501870次
        //2这个数，出现了12502818次
        //3这个数，出现了12498345次
        //4这个数，出现了12496734次
        //5这个数，出现了12502556次
        //6这个数，出现了12504917次
        //7这个数，出现了12498420次
    }

    public static int f1() {
        return (int) (Math.random() * 5) + 1;//[1,6)
    }
    //随机机制，只能用f1，不能使用Math.random()函数

    //这里f2等概率返回[1,6） 1,2,3,4,5
    //因为我们不能使用Math.random()，只能使用f1，所以需要在f1基础上进行改进
    //等概率只有当返回0,1
    public static int f2() {
        int ans = 0;
        do {
            ans = f1();
        } while (ans == 3);
        return ans < 3 ? 0 : 1;
    }

    //等概率0~7返回一个 0 1 2 3 4 5 6 7
    //我们可以借助上面我们弄的0、1等概率返回器f2通过左移来获取0~7
    //000~111 0~7
    public static int f3() {
        return (f2() << 2) + (f2() << 1) + f2();
    }

}
